/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.inve.manager;

import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.inve.dto.SistControlConformidadInveDto;
import com.brain.inve.dto.SistemaControlInveDetaDto;
import com.brain.inve.dto.SistemaControlInveDto;
import com.brain.inve.view.mbean.GuiaRemisionMBean;
import com.brain.inve.view.mbean.IntercambioUbicaMBean;
import com.brain.inve.view.mbean.TransfUnidadMedidaMBean;
import com.brain.inve.view.util.ConstantesInve;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class SistemaControlInveDetaManager extends ComunManager<SistemaControlInveDetaDto> implements Serializable {

    private static Logger logger = Logger.getLogger(SistemaControlInveDetaManager.class);
    private Long idEntidad = 271L;
    @Resource
    private DAOGenerico<SistemaControlInveDetaDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ApplicationMBean applicationMBean;

    /**
     * obtener Sistema de Control Deta por Id
     *
     * @param id
     * @return Sistema de Control Deta
     * @throws DAOException
     */
    public SistemaControlInveDetaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(SistemaControlInveDetaDto.class, id);
    }

    public SistemaControlInveDetaDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        SistemaControlInveDetaDto dto = new SistemaControlInveDetaDto();
        dto.setObligatorio(Boolean.FALSE);
        dto.setEstado(Boolean.TRUE);
        dto.setIsRol(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_USUARIO);
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        return dto;
    }

    public List<SistemaControlInveDetaDto> obtenerHijosPorEmpresa(SistemaControlInveDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from SistemaControlInveDetaDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.sistemaControlInveDto.id = ?";
        listaParametros.add(dto.getId());

        //hqsql += " order by e.transaccion  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<SistemaControlInveDetaDto> obtenerPorTransaccionYEstado(int transaccion, String estado) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from SistemaControlInveDetaDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.sistemaControlInveDto.transaccion = ?";
        listaParametros.add(transaccion);
        hqsql += " and e.sistemaControlInveDto.estadoTransaccion = '" + estado + "' ";
        hqsql += " and e.estado = ?";
        listaParametros.add(Boolean.TRUE);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<SistemaControlInveDetaDto> cargarEncargadosParaPopup(int transaccion, String estado, Long idTransaccion) {
        SistControlConformidadInveManager conformidadManager = (SistControlConformidadInveManager) WebServletContextListener.getApplicationContext().getBean("sistControlConformidadInveManager");
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        List<SistemaControlInveDetaDto> lst = null;
        //Realizamos las validaciones correspondientes segun lo requiera el estado al que se quiere pasar
        boolean validador = true;
        GuiaRemisionManager guiaRemisionManager = (GuiaRemisionManager) WebServletContextListener.getApplicationContext().getBean("guiaRemisionManager");
        GuiaRemisionMBean guiaRemisionMBean = (GuiaRemisionMBean) WebServletContextListener.getApplicationContext().getBean("guiaRemisionMBean");
        IntercambioUbicaManager intercambioUbicaManager = (IntercambioUbicaManager) WebServletContextListener.getApplicationContext().getBean("intercambioUbicaManager");
        IntercambioUbicaMBean intercambioUbicaMBean = (IntercambioUbicaMBean) WebServletContextListener.getApplicationContext().getBean("intercambioUbicaMBean");
        TransfUnidadMedidaManager transfUnidadMedidaManager = (TransfUnidadMedidaManager) WebServletContextListener.getApplicationContext().getBean("transfUnidadMedidaManager");
        TransfUnidadMedidaMBean transfUnidadMedidaMBean = (TransfUnidadMedidaMBean) WebServletContextListener.getApplicationContext().getBean("transfUnidadMedidaMBean");
        if (transaccion == ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_INTERALM) {
            if (estado.equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO)) {
                if (guiaRemisionManager.revisarValidacinoesAntesDeGuardar(guiaRemisionMBean.getDto()) == null) {
                    validador = false;
                } else {
                    validador = true;
                }
            }
        } else if (transaccion == ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_MOVIMIENTO) {
            if (estado.equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO)) {
                if (guiaRemisionManager.revisarValidacinoesAntesDeGuardar(guiaRemisionMBean.getDto()) == null) {
                    validador = false;
                } else {
                    validador = true;
                }
            }
        } else if (transaccion == ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_INTERUBI) {
            if (estado.equals(ConstantesInve.ValoresConstantes.INTERCAMBIO_UBICA_COD_ESTADO_CONFIRMADO)) {
                if (intercambioUbicaManager.revisarValidacinoesAntesDeGuardar(intercambioUbicaMBean.getDto()) == null) {
                    validador = false;
                } else {
                    validador = true;
                }
            }
        } else if (transaccion == ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_TRANFERENCIA) {
            if (estado.equals(ConstantesInve.ValoresConstantes.TRASF_UM_COD_ESTADO_CONFIRMADO)) {
                if (transfUnidadMedidaManager.revisarValidacinoesAntesDeGuardar(transfUnidadMedidaMBean.getDto()) == null) {
                    validador = false;
                } else {
                    validador = true;
                }
            }
        }
        if (validador) {
            try {
                lst = obtenerPorTransaccionYEstado(transaccion, estado);
                SistControlConformidadInveDto dto = null;
                SistControlConformidadInveDto filtro = new SistControlConformidadInveDto();
                filtro.setTransaccion(transaccion);
                filtro.setEstadoTransaccion(estado);
                filtro.setIdTransaccion(idTransaccion);
                if (lst != null && !lst.isEmpty()) {
                    for (SistemaControlInveDetaDto x : lst) {
                        x.setFlagBoton(Boolean.FALSE);
                        if (x.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_ROL)) {
                            filtro.setEncargadoRol(x.getRolDto().getId());
                            dto = conformidadManager.obtenerConformidadParaTransaccionRol(filtro);
                            //Verificamos si el rol del usurio conectado coincide con alguno de los encargados
                            if (sessionMBean.getSessionUsuarioDto().getRolDto().equals(x.getRolDto())) {
                                x.setFlagBoton(Boolean.TRUE);
                            }
                        } else if (x.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_USUARIO)) {
                            filtro.setEncargadoUsuario(x.getUsuarioDto().getId());
                            dto = conformidadManager.obtenerConformidadParaTransaccionUsuario(filtro);
                            //Verificamos si el usurio conectado coincide con alguno de los encargados
                            if (sessionMBean.getSessionUsuarioDto().equals(x.getUsuarioDto())) {
                                x.setFlagBoton(Boolean.TRUE);
                            }
                        }
                        x.setIdTrasaccion(idTransaccion);
                        if (dto != null) {
                            x.setConformidad(Boolean.TRUE);
                            x.setFlagBoton(Boolean.FALSE);
                        } else {
                            x.setConformidad(Boolean.FALSE);
                        }
                        System.out.println("FLAG BOTON -> " + x.getFlagBoton());
                    }
                } else {
                    lst = new ArrayList<SistemaControlInveDetaDto>();
                }
            } catch (Exception ex) {
                recursosManager.showError(ex.getMessage());
                logger.error(ex.getMessage());
                System.out.println(ex.getMessage());
            }
        }
        return lst;
    }

    public String guardar(SistemaControlInveDetaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        try {
            if (sessionMBean.getAccionDetalle() == applicationMBean.getNuevo()) {
                UtilCore.General.toUpperCaseDto(dto);
                nuevo(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";//retroceder();
            } else if (sessionMBean.getAccionDetalle() == applicationMBean.getEditar()) {
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";//retroceder();
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }

    public Boolean guardarDetalle(SistemaControlInveDetaDto dto, List<SistemaControlInveDetaDto> listaDetalles, int contIndex) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        Boolean resultado = validarDatosDelDetalle(dto, listaDetalles, contIndex);
        try {
            System.out.println(resultado);
            if (resultado) {
                if (sessionMBean.getAccionDetalle() == applicationMBean.getNuevo()) {
                    nuevo(dto);
                } else if (sessionMBean.getAccionDetalle() == applicationMBean.getEditar()) {
                    editar(dto);
                }
                recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok"));
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return resultado;
    }

    public Boolean validarDatosDelDetalle(SistemaControlInveDetaDto dto, List<SistemaControlInveDetaDto> listaDetalles, int contIndex) {
        Boolean resultado = true;
        Boolean entra = true;
        int cont = -1;
        if (!listaDetalles.isEmpty()) {
            for (SistemaControlInveDetaDto x : listaDetalles) {
                cont++;
                if (contIndex != -1 && cont == contIndex) {
                    entra = false;
                } else {
                    entra = true;
                }
                if (entra) {
                    if (dto.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_USUARIO)) {
                        if (x.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_USUARIO)) {
                            if (dto.getUsuarioDto().equals(x.getUsuarioDto())) {
                                resultado = false;
                                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("siscontrol.deta.mensaje.1"));
                                break;
                            }
                        } else if (x.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_ROL)) {
                            if (dto.getUsuarioDto().getRolDto().equals(x.getRolDto())) {
                                resultado = false;
                                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("siscontrol.deta.mensaje.3"));
                                break;
                            }
                        }
                    } else if (dto.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_ROL)) {
                        //Validamos que se no se haya agregado este rol
                        if (x.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_ROL)) {
                            if (dto.getRolDto().equals(x.getRolDto())) {
                                resultado = false;
                                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("siscontrol.deta.mensaje.2"));
                                break;
                            }
                        } else if (x.getIsRol().equals(ConstantesInve.ValoresConstantes.SIST_CONTROL_DETA_COD_USUARIO)) {
                            if (dto.getRolDto().equals(x.getUsuarioDto().getRolDto())) {
                                resultado = false;
                                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("siscontrol.deta.mensaje.4"));
                                break;
                            }
                        }
                    }
                }
            }
        }
        return resultado;
    }

    public void nuevoMuchos(List<SistemaControlInveDetaDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<SistemaControlInveDetaDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        SistemaControlInveDetaManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<SistemaControlInveDetaDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<SistemaControlInveDetaDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }
}
